package com.shiro;

import java.io.Serializable;
import java.util.concurrent.TimeUnit;

import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;


/**
 * 
 * shiro session dao
 *
 */
@Component
public class RedisShiroSessionDAO extends EnterpriseCacheSessionDAO {
	
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    //创建session
    @Override
    protected Serializable doCreate(Session session) {
        Serializable sessionId = super.doCreate(session);
        //保存到redis
        setShiroSession(sessionId.toString(), session);
        return sessionId;
    }
    
    //获取session
    @Override
    protected Session doReadSession(Serializable sessionId) {
        return getShiroSession(sessionId.toString());
    }
    

    //更新session
    @Override
    protected void doUpdate(Session session) {
        setShiroSession(session.getId().toString(), session);
    }

    //删除session
    @Override
    protected void doDelete(Session session) {
        redisTemplate.delete(session.getId().toString());
    }
    
    private Session getShiroSession(String key) {
        return (Session)redisTemplate.opsForValue().get(key);
    }
    
    private void setShiroSession(String key, Session session){
        redisTemplate.opsForValue().set(key, session);
        //60分钟过期
        redisTemplate.expire(key, 60, TimeUnit.MINUTES);
    }
}
